import requests ##on the class it is used urllib2, we'll be using requests
import numpy as np
import time
import re
import pandas as pd
from bs4 import BeautifulSoup
from urllib.request import Request, urlopen
import matplotlib.pyplot as plt
import plotly.express as px
import folium
from folium.features import DivIcon
precos_1 = []
precos_2 = []
enderecos_1 = []
descricao = []
enderecos_2 = []
attr1 = []
attr2 = []
attr3 = []
attr4 = []
attr5 = []
for i in range(1,40):
try:
pagina = "?pagina=" + str(i)
url = "https://www.baraohousing.com.br/imoveis/para-alugar/barao-geraldo" + pagina
r = Request(url, headers={"User-Agent": "Mozilla/5.0"})
c = urlopen(r).read()
soup = BeautifulSoup(c, "html.parser")
soup = soup.findAll('div', {'class': 'link-all'})
for j in range(len(soup)):
try:
precos_1.append(soup[j].find('span', {'class': "h-money location"}).text)
except: precos_1.append('not found')
try:
precos_2.append(soup[j].find('div', {'class': "info-right text-xs-right"}).find('p').find('span', {'class': 'h-money'}).text)
except: precos_2.append('not found')
base = soup[j].find('div', {'class': "card-block text-xs-center exclusive-tag-space"})
try:
enderecos_1.append(base.find('h2', {'class': 'card-title'}).text)
except: enderecos_1.append('not found')
try:
descricao.append(base.find('h3', {'class': 'card-text'}).text)
except: descricao.append('not found')
try:
enderecos_2.append(base.find('p', {'class': "description hidden-sm-down"}).text)
except: enderecos_2.append('not found')
base_new = base.find('div', {'class': 'values'}).findAll('div', {'class': 'value'})
try:
attr1.append(base_new[0].text)
except: attr1.append('not found')
try:
attr2.append(base_new[1].text)
except: attr2.append('not found')
try:
attr3.append(base_new[2].text)
except: attr3.append('not found')
try:
attr4.append(base_new[3].text)
except: attr4.append('not found')
try:
attr5.append(base_new[4].text)
except: attr5.append('not found')
except: pass
df = pd.DataFrame(list(zip(precos_1, precos_2, enderecos_1, enderecos_2, descricao, attr1, attr2, attr3, attr4, attr5)), columns = ['preco_1', 'preco_2', 'endereco_1', 'endereco_2', 'descricao', 'attr1', 'attr2', 'attr3', 'attr4', 'attr5'])
df['nQuartos'] = 0
df['nSuites'] = 0
df['nBanheiros'] = 0
df['nVagas'] = 0
df['metros'] = 0
for i in range(df.shape[0]):
if 'quarto' in df.iloc[i, :]['attr1']:
df.loc[i, 'nQuartos'] = df.loc[i, 'attr1'] ##quartos
elif 'quarto' in df.iloc[i, :]['attr2']:
df.loc[i, 'nQuartos'] = df.loc[i, 'attr2']
elif 'quarto' in df.iloc[i, :]['attr3']:
df.loc[i, 'nQuartos'] = df.loc[i, 'attr3']
elif 'quarto' in df.iloc[i, :]['attr4']:
df.loc[i, 'nQuartos'] = df.loc[i, 'attr4']
elif 'quarto' in df.iloc[i, :]['attr5']:
df.loc[i, 'nQuartos'] = df.loc[i, 'attr5']
if 'suíte' in df.iloc[i, :]['attr1']:
df.loc[i, 'nSuites'] = df.loc[i, 'attr1'] ##suites
elif 'suíte' in df.iloc[i, :]['attr2']:
df.loc[i, 'nSuites'] = df.loc[i, 'attr2']
elif 'suíte' in df.iloc[i, :]['attr3']:
df.loc[i, 'nSuites'] = df.loc[i, 'attr3']
elif 'suíte' in df.iloc[i, :]['attr4']:
df.loc[i, 'nSuites'] = df.loc[i, 'attr4']
elif 'suíte' in df.iloc[i, :]['attr5']:
df.loc[i, 'nSuites'] = df.loc[i, 'attr5']
if 'banheiro' in df.iloc[i, :]['attr1']:
df.loc[i, 'nBanheiros'] = df.loc[i, 'attr1'] ##banheiros
elif 'banheiro' in df.iloc[i, :]['attr2']:
df.loc[i, 'nBanheiros'] = df.loc[i, 'attr2']
elif 'banheiro' in df.iloc[i, :]['attr3']:
df.loc[i, 'nBanheiros'] = df.loc[i, 'attr3']
elif 'banheiro' in df.iloc[i, :]['attr4']:
df.loc[i, 'nBanheiros'] = df.loc[i, 'attr4']
elif 'banheiro' in df.iloc[i, :]['attr5']:
df.loc[i, 'nBanheiros'] = df.loc[i, 'attr5']
if 'vaga' in df.iloc[i, :]['attr1']:
df.loc[i, 'nVagas'] = df.loc[i, 'attr1'] ##vagas
elif 'vaga' in df.iloc[i, :]['attr2']:
df.loc[i, 'nVagas'] = df.loc[i, 'attr2']
elif 'vaga' in df.iloc[i, :]['attr3']:
df.loc[i, 'nVagas'] = df.loc[i, 'attr3']
elif 'vaga' in df.iloc[i, :]['attr4']:
df.loc[i, 'nVagas'] = df.loc[i, 'attr4']
elif 'vaga' in df.iloc[i, :]['attr5']:
df.loc[i, 'nVagas'] = df.loc[i, 'attr5']
if 'm²' in df.iloc[i, :]['attr1']:
df.loc[i, 'metros'] = df.loc[i, 'attr1'] ## metros²
elif 'm²' in df.iloc[i, :]['attr2']:
df.loc[i, 'metros'] = df.loc[i, 'attr2']
elif 'm²' in df.iloc[i, :]['attr3']:
df.loc[i, 'metros'] = df.loc[i, 'attr3']
elif 'm²' in df.iloc[i, :]['attr4']:
df.loc[i, 'metros'] = df.loc[i, 'attr4']
elif 'm²' in df.iloc[i, :]['attr5']:
df.loc[i, 'metros'] = df.loc[i, 'attr5']
df = df.drop(['attr1', 'attr2', 'attr3', 'attr4', 'attr5'], axis=1)
for i in range(df.shape[0]):
try:
df.loc[i, 'preco_1'] = df.loc[i, 'preco_1'].replace('.','')
except: pass
try:
df.loc[i, 'preco_2'] = df.loc[i, 'preco_2'].replace('.','')
except: pass
try:
df.loc[i, 'metros'] = df.loc[i, 'metros'].replace(',','.')
except: pass
for i in range(df.shape[0]):
try:
df.loc[i, 'preco_1'] = f.loc[i, 'preco_1'].replace(',','.')
except: pass
try:
df.loc[i, 'preco_2'] = df.loc[i, 'preco_2'].replace(',','.')
except: pass
for i in range(df.shape[0]):
try:
df.loc[i, 'preco_1'] = ''.join(re.findall(r'\d+\.*\d+', df.loc[i, 'preco_1']))
except: pass
try:
df.loc[i, 'preco_2'] = ''.join(re.findall(r'\d+\.*\d+', df.loc[i, 'preco_2']))
except: pass
try:
df.loc[i, 'nQuartos'] = ''.join(re.findall(r'\d+', df.loc[i, 'nQuartos']))
except: pass
try:
df.loc[i, 'nSuites'] = ''.join(re.findall(r'\d+', df.loc[i, 'nSuites']))
except: pass
try:
df.loc[i, 'nBanheiros'] = ''.join(re.findall(r'\d+', df.loc[i, 'nBanheiros']))
except: pass
try:
df.loc[i, 'nVagas'] = ''.join(re.findall(r'\d+', df.loc[i, 'nVagas']))
except: pass
try:
df.loc[i, 'metros'] = ''.join(re.findall(r'\d+\.*\d+', df.loc[i, 'metros']))
except: pass
df['preco_1'] = pd.to_numeric(df['preco_1'])
df['preco_2'] = pd.to_numeric(df['preco_2'])
df['nQuartos'] = pd.to_numeric(df['nQuartos'])
df['nSuites'] = pd.to_numeric(df['nSuites'])
df['nBanheiros'] = pd.to_numeric(df['nBanheiros'])
df['nVagas'] = pd.to_numeric(df['nVagas'])
df['metros'] = pd.to_numeric(df['metros'])
df.loc[df['descricao']=='Kitnet em Campinas'].sort_values('preco_2', ascending=False).head(10)
| preco_1 | preco_2 | endereco_1 | endereco_2 | descricao | nQuartos | nSuites | nBanheiros | nVagas | metros | |
|---|---|---|---|---|---|---|---|---|---|---|
| 364 | 2590 | 3015.0 | Cidade Universitária | Loft 1 locação em frente a Unicamp - acabou de... | Kitnet em Campinas | 1 | 1 | 2 | 1 | 58.00 |
| 333 | 2800 | 2935.0 | Cidade Universitária | Cidade Universitária 01\r\n\r\nExcelente opção... | Kitnet em Campinas | 1 | 0 | 1 | 0 | 45.75 |
| 332 | 2700 | 2835.0 | Cidade Universitária | Cidade Universitária 01\r\n\r\nExcelente opção... | Kitnet em Campinas | 1 | 0 | 1 | 0 | 37.27 |
| 336 | 2600 | 2735.0 | Cidade Universitária | Cidade Universitária 01\r\n\r\nExcelente opção... | Kitnet em Campinas | 1 | 0 | 1 | 0 | 28.61 |
| 335 | 2600 | 2735.0 | Cidade Universitária | Cidade Universitária 01\r\n\r\nExcelente opção... | Kitnet em Campinas | 1 | 0 | 1 | 0 | 31.97 |
| 209 | 2500 | 2635.0 | Cidade Universitária | Cidade Universitária 01\r\n\r\nExcelente opção... | Kitnet em Campinas | 1 | 0 | 1 | 0 | 31.38 |
| 197 | 2500 | 2635.0 | Cidade Universitária | Cidade Universitária 01\r\n\r\nExcelente opção... | Kitnet em Campinas | 1 | 0 | 1 | 0 | 32.20 |
| 211 | 2500 | 2635.0 | Cidade Universitária | Cidade Universitária 01\r\n\r\nExcelente opção... | Kitnet em Campinas | 1 | 0 | 1 | 0 | 32.00 |
| 73 | 2500 | 2500.0 | Cidade Universitária | Cidade Universitária 01 \r\n\r\nPrédio novo co... | Kitnet em Campinas | 2 | 2 | 2 | 1 | 49.00 |
| 210 | 2500 | 2500.0 | Cidade Universitária | Cidade Universitária 01\r\n\r\nExcelente opção... | Kitnet em Campinas | 1 | 0 | 1 | 0 | 40.78 |
df_grouped = round(df[['endereco_1','descricao', 'preco_2']].query("descricao == 'Kitnet em Campinas'").groupby(['endereco_1', 'descricao']).mean().droplevel(level=1,axis=0), 2)
df_grouped
| preco_2 | |
|---|---|
| endereco_1 | |
| Barão Geraldo | 1385.95 |
| Cidade Universitária | 1544.32 |
| Cidade Universitária II | 1025.00 |
| Jardim Santa Genebra II (Barão Geraldo) | 1414.23 |
| Vila Santa Isabel | 1278.12 |
#df_grouped.plot.bar( y = 'preco_2')
px.bar(df_grouped.round(2),
x = df_grouped.index,
y = 'preco_2',
color = df_grouped.index,
color_discrete_sequence = px.colors.qualitative.Bold,
text = 'preco_2',
title = "Kitnet mean prices")
lat = [None, -22.818987, -22.804755, -22.832537, -22.820564]
lon = [None, -47.075775, -47.070146, -47.081662, -47.088729]
size = [None, 60, 60, 30, 35]
color = [None, "blue", "red", "yellow", "purple"]
df_grouped['lat'] = lat
df_grouped['lon'] = lon
df_grouped['size'] = size
df_grouped['color'] = color
#df_grouped
def circle(lat, lon, name, size, color):
folium.CircleMarker(
location=[lat, lon],
radius=size,
popup=name,
color=color,
fill=True,
fill_color=color,
).add_to(m)
def text(lat, lon, text):
folium.map.Marker(
[lat, lon],
icon=DivIcon(
icon_size=(1,1),
icon_anchor=(0,0),
html=text
)
).add_to(m)
m = folium.Map(location=[-22.820658, -47.072427], zoom_start = 14.3,
zoom_control=False, scrollWheelZoom=False, dragging=False)
for i in range(1, len(df_grouped)):
circle(df_grouped.loc[df_grouped.index[i], 'lat'],
df_grouped.loc[df_grouped.index[i], 'lon'],
df_grouped.index[i],
df_grouped.loc[df_grouped.index[i], 'size'],
df_grouped.loc[df_grouped.index[i], 'color'])
for i in range(1, len(df_grouped)):
text(df_grouped.loc[df_grouped.index[i], 'lat']+0.002,
df_grouped.loc[df_grouped.index[i], 'lon']-0.002,
f'<div style="font-size: 9pt"><b>Mean Price(kit): {df_grouped.loc[df_grouped.index[i],"preco_2"]}</b></div>')
m
px.scatter(df.query('descricao == "Kitnet em Campinas"'),
x = 'metros',
y = 'preco_2',
color= 'endereco_1',
hover_name = 'endereco_1',
title = 'Square meter price distribution').update_layout(xaxis_title='metros²', yaxis_title = 'preço')